package Controlador;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ControladorPersistencia.AdminGanacia;
import ControladorPersistencia.AdminRodamiento;
import Dao.SolicitudRodamientoDAO;
import Negocio.Cliente;
import Negocio.CondicionesPago;
import Negocio.Cotizacion;
import Negocio.ItemListaPreciosCPR;
import Negocio.ItemSolicitud;
import Negocio.ListaPreciosCPR;
import Negocio.Proveedor;
import Negocio.Rodamiento;
import Negocio.SolicitudRodamientos;
import Negocio.Stock;
import Persistencia.HibernateUtil;
import VO.CotizacionVO;
import VO.ItemListaPreciosVO;
import VO.ItemSolicitudVO;
import VO.ListaPreciosVO;
import VO.ProveedorVO;
import VO.RodamientoVO;
import VO.SolicitudRodamientosVO;


public class Sistema {
	
	public static void crearCosas() {
		try {
		//Sistema sistema = new Sistema();
		Session session= HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t =session.beginTransaction();
		
		Float ganancia = (float) 15.00;
		AdminGanacia.getInstancia().SetGanancia(ganancia);
		System.out.println("Set Ganancia: " + ganancia + " %");
		
		CondicionesPago cp = new CondicionesPago( "condicion1", 10, (float)0.1);
		Cliente c=new Cliente("27202443","Pablo S" , true, cp);
		
		session.save(c);
		System.out.print("Cliente creado con id: ");
		System.out.println(c.getId());
		t.commit();

		System.out.println("Creo CPR");
		CPR cpr=new CPR();
		System.out.println("Creo ODV");
		Odv odv = new Odv();

		System.out.println("CREO LOS RODAMIENTOS");
		System.out.flush();
		for(int i=0;i<10;i++)
		{
			Iterator<String> paises = CPR.getPaises().iterator();
			while(paises.hasNext())
			{
				Iterator<String> marcas = CPR.getMarcas().iterator();
				String pais=paises.next();
				while(marcas.hasNext())
				{
					System.out.println("Creando rodamiento: "+Integer.toString(i));
					Rodamiento r=new Rodamiento(Integer.toString(1110+i), "Rodamiento cilindrico "+Integer.toString(i), 4 , "ZZ" , new Stock(10 +i, 4));
					r.setMarca(marcas.next());
					r.setOrigen(pais);
					AdminRodamiento.getInstance().grabarRodamiento(r);
					r.getStock().addMovimientoAlta(10,"Stock inicial");
				}
			}
		}
//		session.beginTransaction();
//		List<Rodamiento> localidades=session.createQuery("from Rodamiento").list();
//		
//		Iterator<Rodamiento> it = localidades.iterator();
//		
//		System.out.println("elementos:" + Integer.toString(localidades.size()));
//		
//		session.getTransaction().commit();
//		
//		
		
		System.out.println("Creando Proveedores y Listas de precios");
		Integer index = 0;
		Iterator<String> paises = CPR.getPaises().iterator();
		while(paises.hasNext())
		{
			Iterator<String> marcas = CPR.getMarcas().iterator();
			String origen=paises.next();
			while(marcas.hasNext())
			{
				String marca=marcas.next();
				crearProveedorConListaPrecios(marca+ " " + origen, "30-1234543"+ index.toString() + "-10" , "30 dias",new Float(9+index),new Float(7+index),marca,origen,"ZZ");
			}
		}
//		crearProveedorConListaPrecios("SKF Argentina", "222-333-222", "30 dias",new Float(12),new Float(7),"SKF","Argentina","ZZ");
//		crearProveedorConListaPrecios("SNR Mexico","3333-3335-333","30 Dias",new Float(10),new Float(8),"SNR","Mexico","FF");
//		crearProveedorConListaPrecios("SNR EEUU","3333-4567-333","30 Dias",new Float(10),new Float(11),"SNR","EEUU","ZZ");
//		crearProveedorConListaPrecios("INA Argentina","444-3333-333","30 Dias",new Float(10),new Float(10),"INA","Argentina","ZZ");
		
		
		System.out.println("Armando comparativa de precios");
		ListaPreciosCPR lcpr = cpr.armarComparativaPrecios();
		
		
		Iterator<ItemListaPreciosCPR> it1 = lcpr.getItems().iterator();
		while(it1.hasNext())
		{
			System.out.println(it1.next().toString());
		}

		
		System.out.println("Inicio Test Solicitudes de rodamiento "+"\n");
		
		SolicitudRodamientosVO sr= new SolicitudRodamientosVO();
		sr.setCliente(odv.clienteToVO(c));
		sr.setFecha(new Date());
		
		ArrayList<RodamientoVO> asd = cpr.obtenerRodamientos();
		Iterator<RodamientoVO> itrod=asd.iterator();
		int i=0;
		while(itrod.hasNext())
		{
			ItemSolicitudVO isvo=new ItemSolicitudVO();
			isvo.setRodamiento(itrod.next());
			isvo.setCantidad(5+i);
			sr.getItemsSolicitudes().add(isvo);
			i++;
		}
		
		System.out.println("--------------STOCK DE RODAMIENTOS ---------------");
		itrod = asd.iterator();
		while(itrod.hasNext())
		{
			RodamientoVO r=itrod.next();
			System.out.println("Stock para "+r.getDetalle() + ". Cantidad:"+Integer.toString(r.getStock().getCantidad()));
		}
		System.out.println("---------------------------------------------------");
		String xml=sr.toXml();
		System.out.println("Cargo SolicitudRodamientos::xml="+xml);
		
		odv.cargarSolicitudRodamientos(xml);

		
		
		
		
		
		// -----------------------------------
		// ACA HAY QUE APROBAR LA COTIZACION
		ArrayList<Cotizacion> cotiz = odv.getCoticaciones();

		
		
		if(cotiz.size()!=0)
		{
			System.out.println("Aceptando cotizacion");
			CotizacionVO cvo = new CotizacionVO();
			cvo.setId(cotiz.get(0).getId());
			odv.aceptarCotizacion(cvo);
		}
		else
		{
			System.out.println("FALLA: -- NO SE CREO NINGUNA COTIZACION!!! --  ERROR ERROR");
		}
		// -----------------------------------

		System.out.println("--------------STOCK DE RODAMIENTOS DESPUES de solicitud---------------");
		itrod = asd.iterator();
		while(itrod.hasNext())
		{
			RodamientoVO r=itrod.next();
			System.out.println("Stock para "+r.getDetalle()+". Cantidad:"+Integer.toString(r.getStock().getCantidad()));
		}
		System.out.println("---------------------------------------------------");

		
//		ItemSolicitud itso= new ItemSolicitud(cpr.buscarRodamiento("1110"),2);
//		SolicitudRodamientoDAO.getInstancia().grabarItemSolicitudRodamiento(itso);
//		ItemSolicitud itso2= new ItemSolicitud(cpr.buscarRodamiento("1111"),2);
//		SolicitudRodamientoDAO.getInstancia().grabarItemSolicitudRodamiento(itso2);
		
		System.out.println("FIN DEL TEST");
	

		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	

	public static void crearProveedorConListaPrecios(String nombre,String cuit,String condCompra,Float descuento,Float precioCompra,String marca,String origen,String caract)
	{
		System.out.println("crearProveedorConListaPrecios(marca " + marca+"," + " origen," + origen + ")");
		CPR cpr=new CPR();
		ProveedorVO provVO=new ProveedorVO(nombre,cuit,condCompra,descuento,"UADE 222","4444-4444");
		cpr.altaProveedor(provVO);
		Proveedor prov = cpr.buscarProveedor(provVO);
		provVO.setIdProveedor(prov.getCodigo());
		
		ListaPreciosVO lvo=new ListaPreciosVO("Base",new Date(), null);
		
		try {
			cpr.altaListaPrecios(provVO, lvo);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Iterator<Rodamiento> it = AdminRodamiento.getInstance().obtenerRodamientos().iterator();
		while(it.hasNext())
		{
			Double d = Math.random();
			precioCompra = precioCompra + d.floatValue();
			Rodamiento r=it.next();
			if(r.getOrigen().equals(origen) && r.getMarca().equals(marca))
			{
				System.out.println("Agrego item Lista precio para: "+ r.toString());
				ItemListaPreciosVO ilpvo = new ItemListaPreciosVO(r.getCodigo(),precioCompra,r.getMarca(),r.getOrigen(),caract);
				try {
					cpr.altaItemListaPrecios(provVO, "Base", ilpvo);
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
//			System.out.println(it.next().toString());
		}
//		
		cpr.confirmarListaPrecios(prov, lvo);
	}
}
